import ml_2i, list_usd_rus
import super_matplotlib
ml_2i.__logging__ = 0
import sys, time
from threading import Thread
state = True
wdt = 0
rdt = 1
def start_load(txt):
	global wdt, rdt, state
	wdt = 0
	if state == 1:
		while 1:
			if rdt == 1: break
		wdt = 1
		Thread(target=process, args=(txt,), daemon=True).start()

def stop_load():
	global wdt, rdt
	wdt = 0
	while rdt == 0: pass


def process(txt):
	global wdt, rdt
	rdt = 0
	lt = time.time()
	while 1:
		sys.stdout.write("\r" + txt + "\\ "+str(int((time.time()-lt)*100)/100)+" sec")
		time.sleep(0.5)
		if wdt == 0: sys.stdout.write("\r" + txt + "Done "+str(int((time.time()-lt-0.5)*100)/100)+" sec\n"); break
		sys.stdout.write("\r" + txt + "| "+str(int((time.time()-lt)*100)/100)+" sec")
		time.sleep(0.5)
		if wdt == 0: sys.stdout.write("\r" + txt + "Done "+str(int((time.time()-lt-0.5)*100)/100)+" sec\n"); break
		sys.stdout.write("\r" + txt + "/ "+str(int((time.time()-lt)*100)/100)+" sec")
		time.sleep(0.5)
		if wdt == 0: sys.stdout.write("\r" + txt + "Done "+str(int((time.time()-lt-0.5)*100)/100)+" sec\n"); break
		sys.stdout.write("\r" + txt + "- "+str(int((time.time()-lt)*100)/100)+" sec")
		time.sleep(0.5)
		if wdt == 0: sys.stdout.write("\r" + txt + "Done "+str(int((time.time()-lt-0.5)*100)/100)+" sec\n"); break
	rdt = 1

print("""
===| (ml_2i) v4+MSG demonstration |===
[Описание]: программа клиента алгоритма прогнозирования,
консольная версия, пока что ограничено курсом доллара к рублю.
[Требования]: библиотека matplotlib и requests.
[Ошибки]:""")

### Checking of imported modules ###
im_matplot = 0
im_req = 0
try:
	import matplotlib
	im_matplot = 1
except:
	print("  [ПРЕДУПРЕЖДЕНИЕ]: вызов библиотеки \"matplotlib\" не удался, результат предсказания будет выводится в виде списка в консоли.")

try:
	import requests
	im_req = 1
except:
	print("  [ПРЕДУПРЕЖДЕНИЕ]: вызов библиотеки \"requests\" не удался, используется устаревшая база данных.")
### -===- ###
print('===--------------------------------===')
input('Нажмите enter чтобы продолжить...')
print("""
| Сбор данных |
После сбора всей информации будет возможно создать предсказание,
для этого выполняйте задания ниже.
""")

print('1) История курса валюты/акции\n  Используется база данных истории курса доллара к рублю.')
years = 9
if im_req == 1:
	new = input('  Обновить сохранённые данные? (да/нет): ').lower()
	if new == 'да':
		years = int(input('  Введите сколько лет данных взять (макс. 9): '))
else:
	print('  Отсутсвует модуль \"requests\", используются устаревшие данные.')
	new = 'нет'
	years = 9

print('2) История курса валюты/акции за последний месяц\n  Используется база данных истории курса доллара к рублю.')
days_ago = int(input('  Введите на сколько дней назад от последних 30 дней взять данные: '))
print('===--------------------------------===\n')
print('| Создание предсказания |')
yn = input('Данные собраны, создать прогноз? (да/нет): ').lower()
if yn == 'да':
	print('  Запуск выполнен.')
	if new == 'да':
		start_load('  Обновление текущей базы данных...')
		list_usd_rus.new_data(years)
		stop_load()
	delit = 30  # На сколько дней предсказание
	fllst = list_usd_rus.lst()  # Список цен за год
	trlst = fllst[:len(fllst) - days_ago]  # Из них используются для тренировки

	# Формирование тренировочных примеров #
	start_load('  Создание модели...')
	tr_ex = ml_2i.convert_to_trx_v4(trlst, delit)
	# -----#

	# Тренировка #
	model = ml_2i.new_Model()
	model.training_examples = tr_ex

	model.start_training_v4()
	stop_load()
	# ---#

	# Предсказание #
	start_load('  Создание прогноза...')
	
	from_dt = days_ago  # С какого идентификатора берём за данные input
	from_dt = len(fllst) - from_dt - delit
	to_predict = fllst[from_dt:from_dt + delit]  # Формирование input данных
	wlb = fllst[from_dt + delit - 1:from_dt + delit * 2]

	inpt, out = model.new_prediction_v4(to_predict)  # Процесс предсказания
	out = ml_2i.medium_smooth_graph(inpt, out)  # Сглаживание
	out = ml_2i.medium_smooth_graph(inpt, out)  # Сглаживание
	stop_load()
	print('Завершено.')
	# -----#

	if im_matplot == 1:
		out.reverse()
		out.append(inpt[len(inpt) - 1])
		out.reverse()
		super_matplotlib.draw_graph_with_name([range(len(inpt)), inpt, "Input"],
						 [range(len(inpt) - 1, len(inpt) + len(out) - 1), out, "v4+MSG"],
						 [range(len(inpt) - 1, len(inpt) + len(wlb) - 1), wlb, "Will be"]).save('plot.png')
		print('\nПрогноз сохранён как \"plot.png\"')
	else:
		outtxt = ''
		for i in out:
			outtxt += str(i) + '\n'
		outtxt = outtxt[:len(outtxt)-1]
		fl = open('out.txt', 'w')
		fl.write(outtxt)
		fl.close()
		print('Отсутствует модуль \"matplotlib\", предсказание сохранено ввиде списка как \"out.txt\"')

else:
	print('Отменено, выход...')
